<?php
/**
 * Класс User Базовый класс пользователя
 *  @author Mike
 */

class City extends ActiveRecord {
	protected $tableName = 'city';
	protected $pkName = 'ID_city';

	public static $minImortanceToView = 4;			// Минимальное значения важности города. Города, имеющие значения меньше нигде не отображаются.
	
	/**
	 * Получает название города по его id
	 * 
	 * @param int $cityId - id города
	 */
	public static function getCityNameById($cityId) {
		if(!$cityId) return false;
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `city`.`city_name` FROM `city` WHERE `city`.`ID_city`='" . Service_Escape::absolutelyEscapeString($cityId) . "'";
		return $objDB->selectOneValue($stmt);
	}
	
	/** Получает координаты города по его id
	*
	* @param int $cityId - id города
	*/
	public static function getCityCoordinatesById($cityId) {
		if(!$cityId) return false;
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `city`.`latitude`,`city`.`longitude` FROM `city` WHERE `city`.`ID_city`='" . Service_Escape::absolutelyEscapeString($cityId) . "'";
		return $objDB->selectOneRow($stmt);
	}
	
	/** Получает id ближайшего города для заданной точки
	 *
	 * @param int $cityId - id города
	 */
	public static function findNearest($latitude, $longitude) {
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `city`.`ID_city`, 6371 * ACOS(SIN(" . $latitude . " * PI() / 180) * SIN(`city`.`latitude` * PI() / 180) + COS(" . $latitude . " * PI() / 180) * COS(`city`.`latitude` * PI() / 180) * COS(" . $longitude . " * PI() / 180 - `city`.`longitude` * PI() / 180)) AS `distance` FROM `city` ORDER BY `distance` ASC LIMIT 1";
		$resultArray = $objDB->selectOneRow($stmt);
		return $resultArray['ID_city'];
	}
	
	/**
	 * Функция получает ближайшие по координатам города из БД.
	 * Используется на странице футбольных полей города.
	 * 
	 */
	public function getNearestCities() {
		$objDB = Service_Database::instanse();
		// Получаем ближайщие по координатам города
		$stmt = "SELECT `city`.`city_url`,`city`.`city_name`, 6371 * ACOS(SIN(" . $this->getField('latitude') . " * PI() / 180) * SIN(`city`.`latitude` * PI() / 180) + COS(" . $this->getField('latitude') . " * PI() / 180) * COS(`city`.`latitude` * PI() / 180) * COS(" . $this->getField('longitude') . " * PI() / 180 - `city`.`longitude` * PI() / 180)) AS `distance`
  			FROM `city`
  			INNER JOIN `region` ON `city`.`ID_region`=`region`.`ID_region`
			INNER JOIN `federal_district` ON `region`.`ID_federal_district`=`federal_district`.`ID_federal_district`
  			WHERE `city`.`longitude` IS NOT NULL AND `city`.`latitude` AND `city`.`ID_city` !='" . $this->id . "' AND `city`.`importance_level` >='" . City::$minImortanceToView . "'
  			ORDER BY `distance` ASC
  			LIMIT 21";
		
		return  $objDB->select($stmt);
	}
	
	/**
	 * Функция получает соседние регионы для региона текущего города.
	 * Используется на странице футбольных полей города.
	 */
	public function getNearestRegions() {
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `region`.`region_name`, `region`.`region_url`, `federal_district`.`federal_district_url`
				FROM  `near_region`
				INNER JOIN `region` ON IF(`near_region`.`ID_one_region`='" . $this->getField('ID_region') . "', `near_region`.`ID_another_region`=`region`.`ID_region`, `near_region`.`ID_one_region`=`region`.`ID_region`)
				INNER JOIN `federal_district` ON `region`.`ID_federal_district`=`federal_district`.`ID_federal_district`
				INNER JOIN `city` ON `region`.`ID_region`=`city`.`ID_region` 
				WHERE (`near_region`.`ID_one_region`='" . $this->getField('ID_region') .  "' OR  `near_region`.`ID_another_region`='" . $this->getField('ID_region') . "') AND `city`.`importance_level` >= '" . City::$minImortanceToView . "'
				GROUP BY `region`.`ID_region`
				LIMIT 10";
	
		return  $objDB->select($stmt);
	}
	
	/**
	 * Функция получает основные города для главной страницы футбольных полей(кроме Москвы и Питера)
	 */
	public static function getCititesForFieldsMain() {
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `city`.`city_name`, `city`.`city_url`, `city`.`city_type`
				FROM  `city`
				WHERE `city`.`ID_city` != 1 AND `city`.`ID_city` != 2 AND `city`.`importance_level` >='" . City::$minImortanceToView . "'
				ORDER BY `city`.`city_type` DESC
				LIMIT 19";
		$arr = $objDB->select($stmt);
		return Service_ArrayConverter::sortArray($arr, 'city_name');
	}
}

?>